import { AxiosRequestConfig } from 'axios';
import request from './request';
import { isEmpty } from '../index';
import { ServerResponseData } from "../typing";

/**
 * @description: 封装get请求方法
 * @param {string} url url 请求地址
 * @param {string | object} params 请求参数
 * @param {AxiosRequestConfig} config 请求配置
 * @return {Promise<CustomSuccessData<T>>} 返回的接口数据
 */
const get = <T = any>(
    url: string,
    params?: object | string,
    config?: AxiosRequestConfig): Promise<ServerResponseData<T>> => {

    config = {
        method: 'GET',
        url,
        ...config,
    };

    if (params) {
        config.params = params;
    }
    return request(config);
};

/**
 * @description: 封装post请求方法
 * @param {string} url url 请求地址
 * @param {string | object} params 请求参数
 * @param {AxiosRequestConfig} config 请求配置
 * @return {Promise<CustomSuccessData<T>>} 返回的接口数据
 */
const post = <T = any>(
    url: string,
    params?: object | string,
    config?: AxiosRequestConfig): Promise<ServerResponseData<T>> => {

    config = {
        method: 'post',
        url,
        ...config,
    };

    if (params) {
        config.params = params;
    }
    return request(config);
};

/**
 * @description: 封装发送 JSON 数据的 POST 请求方法
 * @param {string} url 请求地址
 * @param {any} data 请求数据，默认为空字符串
 * @param {AxiosRequestConfig} config 请求配置
 * @return {Promise<ServerResponseData<T>>} 返回的接口数据
 */
const getJson = <T = any>(
    url: string,
    params?: object | string,
    config?: AxiosRequestConfig
): Promise<ServerResponseData<T>> => {
    // 如果 data 是空字符串，转换为空对象
    const requestData = isEmpty(params) ? {} : params;

    return request({
        method: 'GET',
        url,
        data: requestData,
        ...config,
        headers: {
            'Content-Type': 'application/json',
            ...config?.headers,
        },
    });
};

/**
 * @description: 封装发送 JSON 数据的 POST 请求方法
 * @param {string} url 请求地址
 * @param {any} data 请求数据，默认为空字符串
 * @param {AxiosRequestConfig} config 请求配置
 * @return {Promise<ServerResponseData<T>>} 返回的接口数据
 */
const postJson = <T = any>(
    url: string,
    params?: object | string,
    config?: AxiosRequestConfig
): Promise<ServerResponseData<T>> => {
    // 如果 data 是空字符串，转换为空对象
    const requestData = isEmpty(params) ? {} : params;
    return request({
        method: 'POST',
        url,
        data: requestData,
        ...config,
        headers: {
            'Content-Type': 'application/json',
            ...config?.headers,
        },
    });
};

const http = {
    get,
    post,
    postJson,
    getJson
}



export default http;
